'use strict';
module.exports = {
	/**
	 * 生成二维码
	 * @url client/user/kh/createCode 前端调用的url参数地址
	 * data 请求参数
	 * @param {String} invite_code  邀请码
	 */
	main: async (event) => {
		let { data = {}, userInfo, util, filterResponse, originalParam } = event;
		let { customUtil, uniID, config, pubFun, vk, db, _ } = util;
		let { uid } = data;
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------
		let { client, invite_code } = data;

		let dbName = "db-invite-code";
		
		let dbRes = await vk.baseDao.findByWhereJson({
			dbName,
			whereJson: {
				uid: userInfo._id
			}
		})
		/**
		 * 获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制。 更多用法详见 获取二维码。
		 * @param {String} access_token 默认自动获取,不需要传
		 * @param {String} scene        最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
		 * @param {String} page         必须是已经发布的小程序存在的页面（否则报错），例如 pages/index/index, 根路径前不要填加 /,不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
		 * @param {boolean} check_path  默认是true，检查page 是否存在，为 true 时 page 必须是已经发布的小程序存在的页面（否则报错）；为 false 时允许小程序未发布或者 page 不存在， 但page 有数量上限（60000个）请勿滥用。
		 * @param {String} env_version  要打开的小程序版本。正式版为 "release"，体验版为 "trial"，开发版为 "develop"。默认是正式版。
		 * @param {number} width        二维码的宽度，单位 px，最小 280px，最大 1280px
		 * @param {boolean} auto_color  自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调，默认 false
		 * @param {Object} line_color   auto_color 为 false 时生效，使用 rgb 设置颜色 例如 {"r":0,"g":0,"b":0} 十进制表示
		 * @param {boolean} is_hyaline  是否需要透明底色，为 true 时，生成透明底色的小程序 默认false
		 */
		let getUnlimitedRes = await vk.openapi.weixin.wxacode.getUnlimited({
			page: "pages/index/index",
			scene: invite_code,
			width: 500,
			check_path: false,
			env_version: "develop", // 要打开的小程序版本。正式版为 "release"，体验版为 "trial"，开发版为 "develop"。默认是正式版。
		});
		
		if (typeof getUnlimitedRes === "object" && getUnlimitedRes.code) {
			return getUnlimitedRes;
		}
		try {
			// 二进制转base64
			let base64 = Buffer.from(getUnlimitedRes, 'binary').toString('base64')
			getUnlimitedRes =  {
				code: 0,
				base64: `data:image/png;base64,${base64}`
			};
		} catch (err) {
			// 转base64失败
			getUnlimitedRes =  {
				code: -1,
				msg: "生成小程序码失败",
				err: {
					message: err.message,
					stack: err.stack
				}
			};
		}
		
		if(getUnlimitedRes.code === 0) {
			if(!vk.pubfn.isNull(dbRes)) {
				let updateRes = await vk.baseDao.updateAndReturn({
					dbName,
					whereJson: {
						_id: dbRes._id
					},
					dataJson: {
						code: getUnlimitedRes.base64
					}
				})
			} else {
				let addRes = await vk.baseDao.add({
					dbName,
					dataJson: {
						uid: userInfo._id,
						client: client,
						code: getUnlimitedRes.base64
					}
				})
			}
			res["data"] = {
				uid: userInfo._id,
				code: getUnlimitedRes.base64
			};
		} else {
			return {code: -1, msg: "生成小程序码失败，请稍后再试！"}
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	}
}